#ifndef SALES_DATA_H
#define SALES_DATA_H

#include <string>
#include <iostream>

class Sales_data {
// 为 Sales_data 的非成员函数所做的友元申明
    friend Sales_data add(const Sales_data &, const Sales_data &);
    friend std::istream &read(std::istream &, Sales_data &);
    friend std::ostream &print(std::ostream &, const Sales_data &);
// 构造函数
public:
    // 非委托构造函数使用对应的实参初始化成员
    Sales_data(std::string s, unsigned cnt, double price) :
        bookNo(s), units_sold(cnt), revenue(cnt * price) { }
    // 其余构造函数全都委托给另一个构造函数
    Sales_data() : Sales_data("", 0, 0) { }
    explicit Sales_data(const std::string s) : Sales_data(s, 0, 0) { }
    explicit Sales_data(std::istream &s) : Sales_data() { read(is, *this); }
// 接口函数
public:
    std::string isbn() const { return bookNo; }
    Sales_data &combine(const Sales_data&);
// 实现函数
private:
    double avg_price() const { return units_sold ? revenue / units_sold : 0 ;}
// 数据成员
private:
    std::string bookNo;  // 书籍编号，隐式初始化为空串
    unsigned units_sold = 0;  // 销售量,显示初始化为 0
    double revenue = 0.0;  //
};

// Sales_data 的非成员接口函声明
Sales_data add(const Sales_data&, const Sales_data&);
std::ostream &print(std::ostream&, const Sales_data&);
std::istream &read(std::istream&, Sales_data&);

// constexpr 构造函数
class Debug
{
public:
    constexpr Debug(bool b = true) : hw(b), io(b), other(b) { }
    constexpr Debug(bool h, bool i, bool o) : hw(h), io(i), other(o) { }
    constexpr bool any() { return hw || io || other; }
    void set_io(bool b) { io = b; }
    void set_hw(bool b) { hw = b; }
    void set_other(bool b) { other = b; }
private:
    bool hw;  // 硬件错误
    bool io;  // IO错误
    bool other;  // 其他错误
};



#endif // SALES_DATA_H
